home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 1
/
Gekikoh Dennoh Club Vol. 1 (Japan).7z
/
Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin
/
kowin
/
archive
/
sys
/
kowin14d.lzh
/
doc
/
programming
/
user.doc
< prev
next >
Wrap
Text File
|
1994-12-19
|
6KB
|
144 lines
Ko-Window プログラマーズマニュアル
「ユーザーイベントの割り当て方法」
●昔のユーザーイベント
Ko-Window では、ユーザーアプリケーション用に EventUser を用いることができま
す。v2.00 等の昔のサーバーでは、利用方法に特に取り決めはなく、FINDER.win の
ファイル名転送に ComBuffer が使われていただけでした。そのため実際は FINDER
とぶつからないように、きわめてトリック的な使い方が必要で、その頃の影響が今の
USK_WIN 等の独自のフォント転送フォーマットに残されています。
●システムで決まっているユーザーコード
それを考慮してか、従来使われていなかった ComData を識別コードとし、実際の
データは常に ComBuffer の示すポインタで転送するよう prog.doc で取り決めが行
なわれました。
イベント構造体の中で、UserEvent で主に用いられるのは次の2つです。
int ComData 32bit の整数値
void *ComBuffer データ領域へのアドレス
各アプリケーションは、EventUser を受け取る場合には必ず ComData を参照し、そ
の値によって ComBuffer からデータを得ます。ComData が自分の欲しいイベントデー
タでないなら、受け取りません。
prog.doc の取り決めでは、ComData で使用する識別コードは
UserPaste
UserString
UserStrings
UserSheet
の4つのみ規定されています。これらは今までのアプリケーションで慣例的に使われ
てきたいくつかの暗黙のルールのようなものがありますので、それを説明します。
ComData が UserPaste の時の ComBuffer は、char* であり、Clip Board の内容
を示しています。これは通常、ウィンドウマネージャーが発するイベントです。アプ
リケーションはこれをキー入力として受け取るものもありますが、いきなり単体のファ
イル名としてアクションを起こす場合もあります。そのへんの使い分けが、UserString
と微妙に違います。もし複数行にデータが渡る場合は、その区切りは改行キーコード
になります。データの終わりは '\0' です。
ComData が UserString では、ComBuffer はやはり char* であり、こちらはただ
の文字列を転送する場合によく用いられます。受け取り側はそれをキー入力やファイ
ル名等必要に応じて処理します。または外部からの制御コマンドの送信に使われるこ
ともあります。
ComData が UserStrings では、ComBuffer は char** です。これは FINDER での
ファイル名転送フォーマットからきています。KF 等でもこれを用いますので、通常
この UserStrings が送られてきたら、1つ以上のファイル名を示すポインタ配列への
ポインタと見てまず間違いないでしょう。もちろん、ただの複数文字列として転送に
用いることもできます。Command.win 等では受け取った場合はただのキー入力になり
ます。
ComData が UserSheet の場合では、ComBuffer は必ず Sheet* でテキストのグラ
フィックパターンを示します。PED や背景等で使う3階調モノクロのビットマップで
す。Ko-Window 上でのパターン転送では、必ずこのイベントが使われています。(唯
一の例外が USK_WIN, TC_WIN 等の旧型フォントデータです)
case UserEvent:
switch( info->ComData ){
default:
return FALSE;
case UserStrng:
case UserPaste:
KeyString( (char*)info->ComBuffer );
break;
case UserStrings:
:
:
}
return TRUE;
UserEvent 受取例の一部 (よく用いられるパターン)
●ユーザーコードの拡張
さて、上記以外のデータを転送する必要が生じた場合どうすればいいのでしょうか。
prog.doc では、UserSheet から続くコードを便宜割り当てユーザー側で使用できる
ように書いていますが、それでは他の人とコードの取合いになってしまい都合が悪い
のです。
そこで、今までの私の各種アプリケーションでは、以下のようなルールによってユー
ザーコードを使用してきました。
・単純なデータは文字列で転送する (UserString/UserStrings)
文字列でデータを判別し、各ファンクションコードは文字列先頭の識別子
で判定する。
・各アプリケーションのコントロールファンクション呼び出しは、半角4文
字以内で識別子を付け、それをそのまま 32bit の ComData として呼び出
す。
ここで、アプリケーションのコントロールファンクションについてちょっとだけ説
明します。今まで私が組んできたプログラムは、早期からウィンドウ間通信の柔軟性
を大切にしてきました。できるだけデータはウィンドウ外部と任意にやりとりでき、
さらに外部から簡単なイベントコードでそのアプリケーションをコントロールするこ
とができます。
例えば、KF なら ComData= 'KF' として、ComBuffer に実行させたいファンクショ
ン命令文字列のアドレスを入れて転送すると、KF はそれに従った動作をします。つ
まり共通性を持たせるデータだけでなく、その動作をも他のアプリケーションに公開
してしまうのです。
これは、Command.win でも KX_Term20 でもなんでも、内部で複雑な動作のできる
重要なアプリケーションは全部持っています。
そこで、このような外部からそのアプリケーション独自のイベントが必要な場合に
は、KF なら 'KF' 、KX_Term20 なら 'K20' というようにコード割り当てを行ないま
す。
もちろん、たった4文字なので衝突が起こらないとも限りませんが、わかりにくい
コードを順に割り当てるよりはかなり良いのではないでしょうか。よって、今後この
ようなユーザーコードの使用法を使うようにしましょう。また、今まではどちらかと
いうと隠し機能的な扱いであったコントロールファンクションですが、今後識別子を
ドキュメント等で積極的に公開していくことにしましょう。
識別子の付け方は、むやみやたらに用いずできるだけそのアプリケーションが連想
できるもの、バージョン名等を含ませずに、同じアプリケーションなら一貫してその
コードが使えること。もちろん、原則として1アプリケーションは1識別子を用い、
機能の分岐は ConBuffer を使います。ComBuffer はできるだけ文字列へのポインタと
し、直接データを持たず、将来そのアプリケーションで機能拡張が行なわれても問題
ないようにしましょう。
1番いいのは UserStrings のように、ポインタ配列へのポインタとし、最初のポ
インタは、正式なプログラム名で始まる機能を表す文字列を格納します。それ以後の
ポインタは引数として、機能によってさまざまなデータを置くことができます。
(もちろん、強制ではありません)
話はそれますが、上記のコントロールファンクションで述べたように、Ko-Window
の1つの顔として、この柔軟なウィンドウ間通信があげられるようさまざまやってき
ました。ですから、ぜひ皆さんのプログラムも、もっとウィンドウ間通信のやりとり
の重要性に理解を示し、積極的にアプリケーションに組み込んでみて下さい。
1993/4/20 小笠原博之
oga@dgw.yz.yamagata-u.ac.jp
DenDenNET: DEN0006 COR.